/**
 * 本题用TS来写
 * 
 * 行程长度编码（RLE）是一种字符串压缩方法，其工作原理是通过将连续相同字符（重复两次或更多次）替换为字符重复次数（运行长度）和字符的串联。
 * 例如，要压缩字符串 "3322251" ，我们将 "33" 用 "23" 替换，将 "222" 用 "32" 替换，将 "5" 用 "15" 替换并将 "1" 用 "11" 替换。
 * 因此压缩后字符串变为 "23321511"。
 * 
 * 题解
 * 1.本题意思是让我们实现外观数列功能，但前提是先实现行程长度编码功能
 * 2.假定我们的方法是countAndSay(n)。输入 1<=n<=30
 * 3.输入1，结果是"1"
 * 4.输入n，结果是countAndSay(n-1)的行程长度编码
 * 
 * 
 * 思路
 * 1.使用递归获取n-1的行程长度编码
 * 2.循环，依次获取行程长度编码，最终取得n-1的行程长度编码
 * 
 * 行程长度编码实现思路
 * 1.设定数组，依次统计连续字符个数，最终拼接成字符串
 * 2.使用字符，设定num(目标字符个数)、target(目标字符)，依次拼接字符串
 */



/**
 * 行程长度编码
 * @param string 
 */
function rle(string:String):String{
    if(string.length==1) {
        return "1"+string;
    }

    let result:String = ""; //行程长度编码
    let num =1;
    let target =string[0];

    let currIndex = 1;

    while(true){
        if(string[currIndex]!=target || string.length == currIndex){
            //将字符拼接
            result+=num.toString()+target

            //跳出循环
            if(string.length == currIndex){
                break;
            }

            //重置
            target=string[currIndex];
            num=1;
        }else{
            num++
        }


        // console.log(`curr=${string[currIndex]},target="${target},currIndex="${currIndex},num="${num},result="${result}`);

        
        currIndex++;    
    }

    return result;
}


// console.log(rle("3322251"));

/**
 * 数位字符串序列思路1
 */
function countAndSay(n: number): String {
    if(n == 1){
        return "1";
    }else{
        return rle(countAndSay(n-1));
    }
};

console.log(countAndSay(4));

/* ----------------------------分隔线------------------------------------ */